home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / pc / files / p_misc / 7p203upp.exe / V203SRC.LZH / JOIN.C < prev    next >
C/C++ Source or Header  |  1992-06-23  |  5KB  |  240 lines

  1. #include "7plus.h"
  2. #include "globals.h"
  3.  
  4. /*
  5. *** control joining of err-files
  6. ***
  7. ***
  8.  */
  9. int join_control (char *file1, char *file2)
  10. {
  11.   char *q, errnam[MAXPATH], dummi[20];
  12.   int  errn, n;
  13.  
  14.   n = 0;
  15.  
  16.   if (file1 && file2)
  17.     return (join_err (file1, file2));
  18.  
  19.   if (!file1)
  20.   {
  21.     printf ("\007No error report specified.\nBreak.\n");
  22.     return (12);
  23.   }
  24.  
  25.   strcpy (errnam, file1);
  26.  
  27.   errn = 1;
  28.   do
  29.   {
  30.     if ((q = strrchr (errnam, '.')) != NULL)
  31.       *q = EOS;
  32.     sprintf (dummi, ".e%02x", errn++);
  33.     strcat (errnam, dummi);
  34.  
  35.     if (n > 4)
  36.       break;
  37.  
  38.     if (test_exist (errnam))
  39.     {
  40.       n++;
  41.       continue;
  42.     }
  43.  
  44.     if (join_err (file1, errnam))
  45.       break;
  46.  
  47.     n = 0;
  48.   }
  49.   while (errn != 256);
  50.  
  51.   return (0);
  52. }
  53.  
  54.  
  55.  
  56. /*
  57. *** join error reports. This is useful when many different error reports
  58. *** were received. if the sum of missing lines in the reports isn't too big,
  59. *** it may be practical to upload a correction file that covers lines from
  60. *** more than a single error report.
  61.  */
  62.  
  63. int join_err (char *file1, char *file2)
  64. {
  65.   FILE *_file[2], *tmp;
  66.   char *p[2], *file[2], line[2][81];
  67.   char name[2][80], fullname [2][31];
  68.   char ltab[512], dummi[20];
  69.   char *err_rprt = "7PLUS error report:";
  70.   char *scan     = "%12s %s /%30[^/]/ %ld";
  71.   char *scan2    = "%12s %s %ld";
  72.   char *inv_err  = "\007Invalid error report: '%s'\n";
  73.   int  blocksize[2], part[2], _part;
  74.   int  i, j, k;
  75.   long fsize[2];
  76.   ulong timestamp[2];
  77.  
  78.   file[0] = strdup (file1);
  79.   file[1] = strdup (file2);
  80.  
  81.   for (i=0;i<2;i++)
  82.   {
  83.     *name[i] = *fullname[i] = EOS;
  84.     blocksize[i] = part[i] = 0;
  85.     fsize[i] = 0L;
  86.     timestamp[i] = 0UL;
  87.     p[i] = NULL;
  88.  
  89.     if (crc_file (file[i], err_rprt, "00\n", 1) == 1)
  90.       return (7);
  91.  
  92.     _file[i] = fopen (file[i], OPEN_READ_TEXT);
  93.  
  94.     while ((p[i] = my_fgets (line[i], 80, _file[i])) != NULL)
  95.       if (!strncmp (line[i], err_rprt, 19))
  96.         break;
  97.  
  98.     if (!p[i])
  99.     {
  100.       printf (inv_err, file[i]);
  101.       return(7);
  102.     }
  103.     sscanf (&line[i][20], scan, name[i], dummi, fullname[i], &fsize[i]);
  104.     blocksize[i] = get_hex (dummi);
  105.     if (!*fullname[i])
  106.     {
  107.       fsize[i] = 0L;
  108.       sscanf (&line[i][20], scan2, name[i], dummi, &fsize[i]);
  109.     }
  110.   }
  111.   if (strcmp (name[0], name[1]) || (blocksize[0] != blocksize[1]) ||
  112.        ((fsize[0] && fsize[1]) && (fsize[0] != fsize[1])))
  113.   {
  114.     printf ("\007The two error reports do not relate to the same original file!\n");
  115.     printf ("Break.\n");
  116.     return (13);
  117.   }
  118.  
  119.   if (!fsize[0])
  120.     fsize[0] = fsize[1];
  121.  
  122.   if (!fsize[1])
  123.     fsize[1] = fsize[0];
  124.  
  125.   if (!*fullname[0])
  126.     strcpy (fullname[0], fullname[1]);
  127.  
  128.   if (!*fullname[1])
  129.     strcpy (fullname[1], fullname[0]);
  130.  
  131.   if (!(tmp = fopen ("7plus.tmp", OPEN_WRITE_TEXT)))
  132.   {
  133.     printf ("\007Can't write new error report.\nBreak.\n");
  134.     return (1);
  135.   }
  136.  
  137.   fnsplit (name[0], NULL, NULL, line[0], NULL);
  138.   strupr (line[0]);
  139.   fprintf (tmp, " go_text. %s.ERR%s", line[0], delimit);
  140.   fprintf (tmp, "7PLUS error report: %s %03X", name[0], blocksize[0]);
  141.   if (*fullname[0])
  142.     fprintf (tmp, " /%s/", fullname[0]);
  143.   if (fsize[0])
  144.     fprintf (tmp, " %ld", fsize[0]);
  145.   fprintf (tmp, delimit);
  146.  
  147.   part[0] = part[1] = 0;
  148.   for (_part=1;_part<256;_part++)
  149.   {
  150.     for (i=0;i<2;i++)
  151.     {
  152.       if (part[i] < _part && part[i] != -1)
  153.       {
  154.         fscanf (_file[i], "%s", line[i]);
  155.         if (*line[i] == '[')
  156.         {
  157.           sscanf (line[i], "[%lX", ×tamp[i]);
  158.           part[i] = 0;
  159.         }
  160.         else
  161.           part[i] = get_hex (line[i]);
  162.       }
  163.       if (!part[i])
  164.         part[i] = -1;
  165.     }
  166.  
  167.     if (part[0] == -1 && part[1] == -1)
  168.       break;
  169.  
  170.     for (i=0;i<512;i++)
  171.       ltab[i] = 0;
  172.     for (i=0;i<2;i++)
  173.     {
  174.       if (part[i] == _part)
  175.       {
  176.         j = 0;
  177.         while (j != 0xfff)
  178.         {
  179.           fscanf (_file[i], "%s", line[0]);
  180.           j = get_hex (line[0]);
  181.           if (j != 0xfff)
  182.             ltab[j] = 1;
  183.           else
  184.             break;
  185.         }
  186.       }
  187.     }
  188.     for (i=k=0;i<512;i++)
  189.       k += ltab[i];
  190.     if (k)
  191.     {
  192.       fprintf (tmp, "%02X%s", _part, delimit);
  193.       k = 18;
  194.       for (i=0;i<512;i++)
  195.       {
  196.         if (ltab[i])
  197.         {
  198.           fprintf (tmp, "%03X ", i);
  199.           k--;
  200.         }
  201.         if (!k)
  202.         {
  203.           fprintf (tmp, delimit);
  204.           k = 18;
  205.         }
  206.       }
  207.       fprintf (tmp, "FFF%s", delimit);
  208.     }
  209.   }
  210.  
  211.   i = 0;
  212.   if (!timestamp[0] && timestamp[1])
  213.     i = 1;
  214.  
  215.   if (timestamp[i])
  216.     fprintf (tmp, "[%lX]%s", timestamp[i], delimit);
  217.   fprintf (tmp, "00%s________%s stop_text.%s", delimit, delimit, delimit);
  218.  
  219.   fclose (_file[0]);
  220.   fclose (_file[1]);
  221.   fclose (tmp);
  222.  
  223.   if (timestamp[0] && timestamp[1] && timestamp[0] != timestamp[1])
  224.   {
  225.     unlink ("7plus.tmp");
  226.     printf ("\007The two error reports do not relate to the same original file!\n");
  227.     printf ("The timestamps contained are different!\n");
  228.     printf ("Break.\n");
  229.     return (13);
  230.   }
  231.  
  232.   unlink (file[0]);
  233.   rename ("7plus.tmp", file[0]);
  234.   crc_file (file[0], "7P",  "00\n", 0);
  235.  
  236.   printf ("'%s' has been joined to '%s'.\n", file[1], file[0]);
  237.  
  238.   return(0);
  239. }
  240.